package com.loves.admin.util;

import com.loves.admin.util.common.Constant;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.Map;

@Component
public class JwtTokenUtil {
    @Value("${jwt.header}")
    public String JWT_HEADER;

    @Value("${jwt.tokenHead}")
    public String JWT_TOKEN_HEAD;

    @Value("${jwt.expiration}")
    public long JWT_EXPIRATION;

    /**
     * @Author: LD
     * @Description:创建token
     * @Date: 2019/9/4 15:06
     * @Param subject 主题
     * @Param claims 载荷，主体内容
     * @return: java.lang.String
     **/
    public static String createToken(String subject, Map claims){
        return Jwts.builder().setClaims(claims)//载荷
                .setSubject(subject)//主题
                .setExpiration(new Date(System.currentTimeMillis()+ Constant.EXPIRATION_DATE))//过期时间
                .signWith(SignatureAlgorithm.HS512, Constant.SALT)//签名
                .compact();//生成JWT
    }

    /**
     * @Author: LD
     * @Description: 解析token
     * @Date: 2019/9/4 15:11
     * @Param token
     * @return: io.jsonwebtoken.Claims
     **/
    private static Claims getTokenBody(String token){
        return Jwts.parser()
                //.setSigningKey(publicKey)
                .setSigningKey(Constant.SALT)
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * @Author: LD
     * @Description:解析token,获得subject中的信息
     * @Date: 2019/9/4 15:13
     * @Param token
     * @return: java.lang.String
     **/
    public static String parseToken(String token) throws Exception{
        String subject = getTokenBody(token).getSubject();
        return subject;
    }

    /**
     * @Author: LD
     * @Description:获取token自定义属性
     * @Date: 2019/9/4 15:16
     * @Param token:
     * @return: java.util.Map<java.lang.String, java.lang.Object>
     **/
    public static Map<String,Object> getClaims(String token) throws Exception{
        Map<String,Object> claims = getTokenBody(token);
        return claims;
    }

}
